package com.zfk.framework.casefield_validator;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ValidatorCaseField {
    public static final Logger logger = LogManager.getLogger(ValidatorCaseField.class);
    /**
     * 校验字符串字段存在且值不为空 url, method, detail, requestType
     * @param caseId 用例编号
     * @param fieldName 字段名称
     * @param filePath 文件路径
     * @param caseDataMap 用例数据
     */
    public static  void  validateStringField( String caseId,String fieldName, String filePath,
                                              Map<String, Object> caseDataMap){
        if(!caseDataMap.containsKey(fieldName)){
            logger.error("用例{}缺少字段{}，请检查文件{}",caseId,fieldName,filePath);
            throw new IllegalArgumentException("文件"+filePath+"中用例 " + caseId + " 缺少字段 " + fieldName + "！");
        }
        Object fieldValue = caseDataMap.get(fieldName);
        if (fieldValue== null || !(fieldValue instanceof String) || ((String) fieldValue).trim().isEmpty()){
            logger.error("用例{}字段{}格式不正确，请检查文件{}",caseId,fieldName,filePath);
            throw new IllegalArgumentException("文件"+filePath+"中用例 " + caseId + " 字段 " + fieldName + " 格式错误！");
        }
    }

    /**
     * 校验Map字段存在且值不为空 headers,  expected,
     * @param caseId 用例编号
     * @param fieldName 字段名称
     * @param filePath 文件路径
     * @param caseDataMap 用例数据
     */
    public static void validateMapField( String caseId,String fieldName, String filePath,
                                         Map<String, Object> caseDataMap){
        if (!caseDataMap.containsKey(fieldName)) {
            logger.error("文件{}中用例 {} 缺少 {} 字段",filePath,  caseId, fieldName);
            throw new IllegalArgumentException(" 文件: " + filePath +"中的用例 " + caseId +  "缺少 " + fieldName + " 字段！");
        }
        Object fieldValue = caseDataMap.get(fieldName);
        if (fieldValue == null || !(fieldValue instanceof Map) ) {
            logger.error("文件{}中用例 {} 字段 {} 格式错误，必须为map（字典）！",filePath,  caseId, fieldName);
            throw new IllegalArgumentException("文件"+filePath+"中用例 " + caseId + " 字段 " + fieldName + " 错误！");
        }
    }

    /**
     * 校验Map字段存在且值但允许为空 data,extract
     * @param caseId 用例编号
     * @param fieldName 字段名称
     * @param filePath 文件路径
     * @param caseDataMap 用例数据
     */
    public  static  void validateOptionalMapField(String caseId, String fieldName, String filePath,
                                                  Map<String, Object> caseDataMap){
        if(!caseDataMap.containsKey(fieldName)){
            logger.error("文件{}中用例 {} 缺少 {} 字段",filePath,  caseId, fieldName);
            throw new IllegalArgumentException(" 文件: " + filePath +"中的用例 " + caseId +  "缺少 " + fieldName + " 字段！");
        }
        Object fieldValue = caseDataMap.get(fieldName);
        if (fieldValue != null && !(fieldValue instanceof Map)) {
            logger.error("文件{}中用例 {} 字段 {} 格式错误，必须为map（字典）！", filePath, caseId, fieldName);
            throw new IllegalArgumentException("文件" + filePath + "中用例 " + caseId + " 字段 " + fieldName + " 错误！");
        }

    }
    /**
     * 校验expected字段，必须为map且不能为空，必须包含statusCode(值不为空的)字段
     * @param caseId 用例编号
     * @param fieldName 字段名称
     * @param filePath 文件路径
     * @param caseDataMap 用例数据
     */
    public static void validateExpectedField(String caseId, String fieldName, String filePath,
                                             Map<String, Object> caseDataMap) {
        // 首先使用通用Map字段校验方法校验expected字段
        validateMapField(caseId, fieldName, filePath, caseDataMap);

        @SuppressWarnings("unchecked")
        Map<String, Object> expectedMap = (Map<String, Object>) caseDataMap.get(fieldName);

        // 校验expected字段不为空
        if (expectedMap.isEmpty()) {
            logger.error("文件{}中用例 {} 字段 {} 不能为空", filePath, caseId, fieldName);
            throw new IllegalArgumentException("文件" + filePath + "中用例 " + caseId + " 字段 " + fieldName + " 不能为空！");
        }

        // 校验必须包含statusCode字段且不为空
        validateFieldNotEmpty(expectedMap, "statusCode", caseId, fieldName, filePath);
    }
    /**
     * 校验Map中的字段不为空
     * @param map 要校验的Map
     * @param fieldName 字段名称
     * @param caseId 用例编号
     * @param parentFieldName 父字段名称
     * @param filePath 文件路径
     */
    public static void validateFieldNotEmpty(Map<String, Object> map, String fieldName, String caseId, String parentFieldName, String filePath) {
        if (!map.containsKey(fieldName)) {
            logger.error("文件{}中用例 {} 字段 {} 必须包含{}字段", filePath, caseId, parentFieldName, fieldName);
            throw new IllegalArgumentException("文件" + filePath + "中用例 " + caseId + " 字段 " + parentFieldName + " 必须包含" + fieldName + "字段！");
        }

        Object fieldValue = map.get(fieldName);
        if (fieldValue == null || (fieldValue instanceof String && ((String) fieldValue).trim().isEmpty())) {
            logger.error("文件{}中用例 {} 字段 {} 中的{}字段值不能为空", filePath, caseId, parentFieldName, fieldName);
            throw new IllegalArgumentException("文件" + filePath + "中用例 " + caseId + " 字段 " + parentFieldName + " 中的" + fieldName + "字段值不能为空！");
        }
    }
    /**
     * 校验extract字段
     * @param caseId 用例编号
     * @param fieldName 字段名称
     * @param filePath 文件路径
     * @param caseDataMap 用例数据
     */
    public static void validateExtractField(String caseId, String fieldName, String filePath,
                                            Map<String, Object> caseDataMap) {
        // 这里可以添加extract字段的校验逻辑
        validateOptionalMapField(caseId, fieldName, filePath, caseDataMap);
    }

    /**
     * 获取caseDataMap中校验通过 的Map字段的值
     * @param fieldName 字段名称
     * @param caseDataMap 用例数据
     * @return 字段值
     */
    @SuppressWarnings("unchecked")
    public static  Map<String, Object> getMapFieldValue(String fieldName, Map<String, Object> caseDataMap) {
        Object fieldValue = caseDataMap.get(fieldName);
        return (fieldValue instanceof Map) ? (Map<String, Object>) fieldValue : null;

    }

}
